package br.com.cefetrn.apoena.view.action;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import br.com.cefetrn.apoena.dominio.entity.AreasAtuacaoEntidadeFinanciadora;
import br.com.cefetrn.apoena.dominio.entity.AreasAtuacaoPublicoAlvo;
import br.com.cefetrn.apoena.dominio.entity.AreasDeAtuacao;
import br.com.cefetrn.apoena.dominio.entity.AreasDeAtuacaoEntidadeExecutora;
import br.com.cefetrn.apoena.dominio.entity.Endereco;
import br.com.cefetrn.apoena.dominio.entity.EntidadeExecutora;
import br.com.cefetrn.apoena.dominio.entity.EntidadeFinanciadora;
import br.com.cefetrn.apoena.dominio.home.Home4AreasAtuacaoPublicoAlvo;
import br.com.cefetrn.apoena.dominio.home.Home4AreasDeAtuacao;
import br.com.cefetrn.apoena.dominio.home.Home4AreasDeAtuacaoEntidadeExecutora;
import br.com.cefetrn.apoena.dominio.home.Home4EntidadeExecutora;
import br.com.nordestefomento.jmatryx.util.UTL_Date;

public class Action4entidadeExecutora extends AxActionAPOENA {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private static final Log LOG = LogFactory
			.getLog(Action4entidadeExecutora.class);
	private EntidadeExecutora entidadeExecutora = new EntidadeExecutora();
	
	private List<String> unidadesFederativas = Endereco.UNIDADES_FEDERATIVAS;

	// Lista de Entidades Executoras a serem exibidas na consulta
	private List<EntidadeExecutora> executoras = new ArrayList<EntidadeExecutora>();

	// Lista completa
	private List<AreasDeAtuacao> areas;

	// Lista das opcoes selecionadas
	private List<AreasDeAtuacao> retorno;

	// Objeto que sera persistido na tabela Area de atuacao entidade executora
	private AreasDeAtuacaoEntidadeExecutora aaex;

	/*
	 * Irá armazenar todos os objetos instanciados acima para facilitar o
	 * momento da persistencia.
	 */
	private List<AreasDeAtuacaoEntidadeExecutora> aexs = new ArrayList<AreasDeAtuacaoEntidadeExecutora>();

	// Homes
	private Home4EntidadeExecutora home4EntidadeExecutora = new Home4EntidadeExecutora();
	private Home4AreasDeAtuacao areaHome = new Home4AreasDeAtuacao();
	private Home4AreasAtuacaoPublicoAlvo homeAreasAtuacaoPublicoAlvo = new Home4AreasAtuacaoPublicoAlvo();

	// Datas
	private String dDeInscricao, dTempoDeAtuacao;

	public static final DateFormat pt_BR_simple = new SimpleDateFormat(
			"dd/MM/yyyy");

	// INPUT DO FORMULÁRIO
	private List<String> strAreas = new ArrayList<String>();

	private List<String> strAreasPublico = new ArrayList<String>();

	private int codAreaAtuacaoBuscada = new Integer(0);

	public void prepare() throws Exception {

		LOG.info("Starting prepare()");

		home4EntidadeExecutora.setSession(getSession());
		areaHome.setSession(getSession());
		homeAreasAtuacaoPublicoAlvo.setSession(getSession());
		// Recebendo lista completa do banco de dados
		areas = areaHome.findAll();

	}

	@Override
	protected String go() {
		entidadeExecutora.setDataDeInscricao(new Date());
		System.out.println(entidadeExecutora.getDataDeInscricao());
		LOG.info("Starting go()");

		/*
		 * Popula o objeto da tabela area de atuacao entidade executora com a
		 * lista de retorno com apenas as opcoes marcadas
		 */
		if (retorno != null) {
			for (AreasDeAtuacao aa : retorno) {
				for (AreasAtuacaoPublicoAlvo apa : aa
						.getAreasAtuacaoPublicoAlvos()) {
					aaex = new AreasDeAtuacaoEntidadeExecutora();
					aaex.setAreasDeAtuacao(aa);
					aaex.setEntidadeExecutora(entidadeExecutora);
					aaex.setPublicoAlvo(apa.getPublicoAlvo());
					aexs.add(aaex);
				}
			}
		}

		// Chamada do metodo para persistencia do objeto
		if (CADASTRO.equalsIgnoreCase(tipo))
			cadastrar();

		if (BUSCA.equalsIgnoreCase(tipo))
			executoras = buscar();
		if (EDICAO.equalsIgnoreCase(tipo))
			editar();
		if (REMOCAO.equalsIgnoreCase(tipo))
			deletar();
		return result;
	}

	private void deletar() {
		// TODO Auto-generated method stub
		home4EntidadeExecutora.setSession(getSession());
		home4EntidadeExecutora.delete(entidadeExecutora);

	}

	private void editar() {
		// TODO Auto-generated method stub
		home4EntidadeExecutora.setSession(getSession());
		home4EntidadeExecutora.attachDirty(entidadeExecutora);

	}

	private List<EntidadeExecutora> buscar() {

		String municipio = null;
		AreasDeAtuacao a = null;
		if (botao.equalsIgnoreCase("buscar")) {
			if (codAreaAtuacaoBuscada != 0) {
				a = areaHome.findById(codAreaAtuacaoBuscada);

				if (entidadeExecutora.getEndereco().getCidade() != null) {
					municipio = entidadeExecutora.getEndereco().getCidade();
				}
				return home4EntidadeExecutora.findEntidadesExecutoras(a,
						municipio);
				// TODO Auto-generated method stub
			}
		}
		return null;
	}

	private void cadastrar() {
		// cadastra entidade executora
		Home4EntidadeExecutora eeHome = new Home4EntidadeExecutora();
		Home4AreasDeAtuacaoEntidadeExecutora aeeHome = new Home4AreasDeAtuacaoEntidadeExecutora();
		eeHome.setSession(getSession());
		aeeHome.setSession(getSession());
		if (botao.equalsIgnoreCase("ENVIAR")) {
			if (entidadeExecutora.getNumeroDeVoluntarios() > 0)
				entidadeExecutora.setVoluntarios(true);
			try {
				entidadeExecutora.setDataDeInscricao(pt_BR_simple
						.parse(dDeInscricao));
				entidadeExecutora.setTempoDeAtuacao(pt_BR_simple
						.parse(dTempoDeAtuacao));
			} catch (ParseException e) {
				e.printStackTrace();
				addActionError("Digite os campos de data DO formulário no formato dd/mm/aaaa");
			}

			entidadeExecutora.setLogin(criaLogin());
			loadAreasDeAtuacaoEntidadeExecutora();
			eeHome.persist(entidadeExecutora); // persistindo entidade
												// executora

			// Persistindo na tabela areas de atuacao entidade executora
			/*for (AreasDeAtuacaoEntidadeExecutora aaee : aexs)
				aeeHome.persist(aaee);*/

			addActionMessage("CADASTRO REALIZADO COM SUCESSO!");
			result = SUCCESS;
		}

	}

	private void loadAreasDeAtuacaoEntidadeExecutora() {

		Set<AreasDeAtuacaoEntidadeExecutora> areas = new HashSet<AreasDeAtuacaoEntidadeExecutora>();

		for (AreasAtuacaoPublicoAlvo areaPublico : loadAreasAtuacaoPublicoAlvo())
			areas.add(new AreasDeAtuacaoEntidadeExecutora(areaPublico
					.getAreasDeAtuacao(), entidadeExecutora, areaPublico
					.getPublicoAlvo()));

		entidadeExecutora.setAreasDeAtuacaoEntidadeExecutoras(areas);

	}

	private List<AreasAtuacaoPublicoAlvo> loadAreasAtuacaoPublicoAlvo() {

		List<AreasAtuacaoPublicoAlvo> areasPublico = new ArrayList<AreasAtuacaoPublicoAlvo>();

		if (strAreasPublico != null && !strAreasPublico.isEmpty()) {

			for (String id : strAreasPublico) {
				areasPublico.add(homeAreasAtuacaoPublicoAlvo
						.findById(new Integer(id)));
			}

		}

		return areasPublico;
	}

	public EntidadeExecutora getEntidadeExecutora() {
		return entidadeExecutora;
	}

	public void setEntidadeExecutora(EntidadeExecutora entidadeExecutora) {
		this.entidadeExecutora = entidadeExecutora;
	}

	public List<AreasDeAtuacao> getAreas() {
		return areas;
	}

	public void setAreas(List<AreasDeAtuacao> areas) {
		this.areas = areas;
	}

	public List<AreasDeAtuacao> getRetorno() {
		return retorno;
	}

	public void setRetorno(List<AreasDeAtuacao> retorno) {
		this.retorno = retorno;
	}

	public AreasDeAtuacaoEntidadeExecutora getAaex() {
		return aaex;
	}

	public void setAaex(AreasDeAtuacaoEntidadeExecutora aaex) {
		this.aaex = aaex;
	}

	public List<AreasDeAtuacaoEntidadeExecutora> getAexs() {
		return aexs;
	}

	public void setAexs(List<AreasDeAtuacaoEntidadeExecutora> aexs) {
		this.aexs = aexs;
	}

	public String getDDeInscricao() {
		return dDeInscricao;
	}

	public void setDDeInscricao(String deInscricao) {
		dDeInscricao = deInscricao;
	}

	public String getDTempoDeAtuacao() {
		return dTempoDeAtuacao;
	}

	public void setDTempoDeAtuacao(String tempoDeAtuacao) {
		dTempoDeAtuacao = tempoDeAtuacao;
	}

	public int getCodAreaAtuacaoBuscada() {
		return codAreaAtuacaoBuscada;
	}

	public void setCodAreaAtuacaoBuscada(int codAreaAtuacaoBuscada) {
		this.codAreaAtuacaoBuscada = codAreaAtuacaoBuscada;
	}

	public List<EntidadeExecutora> getExecutoras() {
		return executoras;
	}

	public void setExecutoras(List<EntidadeExecutora> executoras) {
		this.executoras = executoras;
	}

	public List<String> getStrAreas() {
		return strAreas;
	}

	public void setStrAreas(List<String> strAreas) {
		this.strAreas = strAreas;
	}

	public List<String> getStrAreasPublico() {
		return strAreasPublico;
	}

	public void setStrAreasPublico(List<String> strAreasPublico) {
		this.strAreasPublico = strAreasPublico;
	}

	public List<String> getUnidadesFederativas() {
		return unidadesFederativas;
	}

	public void setUnidadesFederativas(List<String> unidadesFederativas) {
		this.unidadesFederativas = unidadesFederativas;
	}

	public static DateFormat getPt_BR_simple() {
		return pt_BR_simple;
	}
	
	
	
	

}
